import scrapy
from scrapy_dangdangwang.items import ScrapyDangdangwangItem


class DangdangwangSpider(scrapy.Spider):
    name = "dangdangwang"
    # 如果是多页下载必须调整域名，一般就是xxxx.com即可
    allowed_domains = ["bang.dangdang.com"]
    start_urls = ["http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-1"]
    base_url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-'
    page = 1

    def parse(self, response):
        print("*" * 100)
        # src = //div[@class="bang_list_box"]//ul/li//div[@class="pic"]//img/@src
        # name = //div[@class="bang_list_box"]//ul/li//div[@class="pic"]//img/@alt
        # author = //div[@class="bang_list_box"]//ul/li//div[@class="publisher_info"][1]/a[1]/text()
        # 所有的selector对象都可以再次调用xpath()方法
        li_list = response.xpath('//div[@class="bang_list_box"]//ul/li')
        for li in li_list:
            # !!!!!!!当爬取图片时由于懒加载要注意以下四点：
            #                                     （1） 有data-original的要使用data-original而不是src
            #                                      (2) 要用最开始初始页面加载时的标签或者属性名
            #                                     （3） 有的时候前几张图片或者末尾几张图片属性设置与大部分不同，注意观察，
            #                                          比如，只有src属性而没有data-original，因为它一开始就要加载
            #                                     （4） 有的时候获取到的图片链接src是默认不带‘http://’的因此在获取图片的时候要手动加上
            src = li.xpath('.//div[@class="pic"]//img/@src').extract_first()
            name = li.xpath('.//div[@class="pic"]//img/@alt').extract_first()
            author = li.xpath('.//div[@class="publisher_info"][1]/a[1]/text()').extract_first()  # 默认下标从1开始
            print(src, name, author)
            book = ScrapyDangdangwangItem(src=src, name=name, author=author)  # 注意这里的src必须带有http，如果没有需要自己手动加上'http://'
            # 获取一个book就交给pipelines
            yield book  # 相当于是pipelines的形参item ===>字典类型的对象

            # 换页
            if self.page < 5:
                self.page += 1
                url = self.base_url + str(self.page)  # 注意整型的转换
                # scrapy.Request()就是get()请求，parse注意不要加()
                yield scrapy.Request(url=url, callback=self.parse)
